#!/bin/bash
##################################################################################################
##  Purpose:HGDB pg_dump 
##  Author :syd
##  Created:2023-10-12
##  Version:1
##################################################################################################
# 1.日志输出格式
log(){
	LOGFILE=init_hgdb_$(date +"%Y%m%d").log
	LOGTYPE=$1
	NOW_TIME='['$(date +"%Y-%m-%d %H:%M:%S")']'
	case $LOGTYPE in
	ERROR)
	    echo -e "\033[31m$NOW_TIME [$1]$2\033[0m" 2>&1 | tee -a $LOGFILE;;
	INFO)
	    echo -e "\033[34m$NOW_TIME [$1]$2\033[0m" 2>&1 | tee -a $LOGFILE;;
	INPUT)
	    echo -e "\033[33m$NOW_TIME [$1]$2\033[0m" 2>&1 | tee -a $LOGFILE;;
	CMD)
		echo -e -n "\033[37m$NOW_TIME $2\n\033[0m" 2>&1 | tee -a $LOGFILE
		echo -e -n "\033[37m `$2`\n\033[0m" 2>&1 | tee -a $LOGFILE;;
	esac
}

# 2.定义变量
def_var(){
	read -p "数据备份目录【默认:/data/highgo/hgdbbak】: " BACK_DIR
	log INFO "你选择的数据备份目录为：${BACK_DIR:=/data/highgo/hgdbbak}"
	read -p "要备份的数据库【默认:highgo】: " DBNAME
	log INFO "你将要备份的数据库为：${DBNAME:=highgo}"
	read -p "使用的备份用户【需要有备份对应数据库的权限，默认:sysdba】: " USERNAME
	log INFO "你将使用的备份用户为：${USERNAME:=sysdba}"
	read -p "使用的备份用户密码【默认:Hello@123】: " PASS
	log INFO "你将使用的备份用户密码为：${PASS:=Hello@123}"
	read -p "要保留备份文件的数量【默认:3】: " Num
	log INFO "你将要保留备份文件的数量为：${Num:=3}"
	
	if [ -d $BACK_DIR ]
	then
			:
	else
		mkdir -p $BACK_DIR
	fi
}

# 3.构造定时备份
pg_dump(){
    while [[ ! $FORMAT =~ [p,P,c,C] ]]
	do
	read -p "要备份的数据格式【p 为sql文本格式，c 为二进制dump格式，默认:p sql文本格式】: " FORMAT
	log INFO "你将要备份的数据格式为：${FORMAT:=p}"
	case "$FORMAT" in
		P|p)
			echo -e "#!/bin/bash\nPGPASSWORD=$PASS pg_dump -U $USERNAME -d $DBNAME -f $BACK_DIR/${DBNAME}_\$(date +\"%Y-%m-%d_%H:%M:%S\").sql" > $BACK_DIR/pg_dump_cron.sh
			;;
		C|c)
			echo -e "#!/bin/bash\nPGPASSWORD=$PASS pg_dump -U $USERNAME -d $DBNAME -Fc -f $BACK_DIR/${DBNAME}_\$(date +\"%Y-%m-%d_%H:%M:%S\").dump" > $BACK_DIR/pg_dump_cron.sh
			;;
		*)
			log ERROR "只可输入p或c，请重新输入！"
	esac
	done
 
cat >> /var/spool/cron/root <<EOF
10 00  * * *  source  $BACK_DIR/pg_dump_cron.sh
EOF

log INPUT "**************************************************************************************************************"
log INPUT "******************定时导出任务配置完成！请执行 crontab -e 按需求修改备份时间并进行备份测试。******************"
log INPUT "**************************************************************************************************************"
}

# 4.过期清理
del_file(){
cat >> $BACK_DIR/pg_dump_cron.sh <<EOF
ReservedNum=$Num
FileNum=\$(ls -l $BACK_DIR/$DBNAME* |grep ^- |wc -l)

while(( FileNum > ReservedNum))
do
    OldFile=\$(ls -rt $BACK_DIR/$DBNAME*| head -1)
    echo  "Delete File:" \$OldFile
    rm -f \$OldFile
    let "FileNum--"
done
EOF
}


# 5.主函数
main(){
	log
	def_var
	pg_dump
	del_file
} 

# 6.执行
main